#include "lista.h"
lista::lista()
	{
  add=true;
  (*this).insd_p();
  while(add==true)
    {
      if(strcmp((*this).unnod->info,"*")>0)
      (*this).insd_cf();
    }
	}
void lista::insd_p()
  {
  int m;
  char M[10];
  std::cout<<"info : ";std::cin>>M;
  if(strcmp(M,"*")>0)
    {
    std::cout<<"cheia : ";std::cin>>m;
    (*this).unnod=(ref)malloc (sizeof(Tnod));
    (*this).unnod->cheie=m;
    strcpy((*this).unnod->info,M);
    (*this).unnod->ant=NULL;
    (*this).unnod->urm=NULL;
    (*this).prim=(*this).unnod;
    q=(*this).unnod;
    }
  else
    {
    (*this).prim=(ref)malloc(sizeof(Tnod));
    (*this).prim=NULL;
    add=false;
    }
  }
void lista::insd_cf()
  {
  int m;
  char M[10];
  std::cout<<"info : ";std::cin>>M;
  if(strcmp(M,"*")>0)
    {
    (*this).unnod=(ref)malloc(sizeof(Tnod));
    std::cout<<"cheia : ";std::cin>>m;
    (*this).unnod->cheie=m;
    strcpy((*this).unnod->info,M);
    (*this).unnod->ant=NULL;
    (*this).unnod->urm=(*this).prim;
    (*this).prim->ant=(*this).unnod;
    (*this).prim=(*this).unnod;
    }
    else
    add=false;
  }
void lista::print()
  {
  if ((*this).prim!=NULL)
    {
    (*this).unnod=(*this).prim;
    while ((*this).unnod!=NULL)
    {
    std::cout<<"cheia : "<<(*this).unnod->cheie<<"\tinfo : "<<(*this).unnod->info;
    (*this).unnod=(*this).unnod->urm;
    std::cout<<"\n";
    }
    }
    else std::cout<<"Lista vida!\n";
  }
void lista::cauta()
  {
  int k;
  std::cout<<"Introduceti cheia elementului cautat : ";std::cin>>k;
  int b=0;
  r=(*this).prim;
  while ((b==0) && (r!=NULL))
    if (r->cheie==k)
    {
    b=1;
    std::cout<<"Elementul cu cheia : \""<<r->cheie<<"\""<<" contine informatia : \""<<r->info<<"\"."<<"\n";
    }
    else r=r->urm;
  if(b==0)
    std::cout<<"Elementul cu cheia : \""<<k<<"\" nu a fost gasit in lista!.\n";
  }
void lista::suprimad_n()
  {
    int k;
    std::cout<<"Introduceti cheia elementului de suprimat : ";std::cin>>k;
    r=(*this).prim;
    while(r->cheie!=k)
      r=r->urm;
    ref suc,pred;
    pred=r->ant;
    suc=r->urm;
    if (r->ant!=NULL) pred->urm=suc;
    if (r->urm!=NULL) suc->ant=pred;
    if ((*this).prim==r) (*this).prim=(*this).prim->urm;
    free(r);
  }
ref lista::getPrim()
  {
  ref d;
  d=(*this).prim;
  return d;
  }
bool lista::operator==(lista A)
  {
    ref primA=A.getPrim();
    ref primTh=(*this).prim;
    bool egale=true;
    while(primA!=NULL && primTh!=NULL && egale==true)
      {
      if(primA->cheie!= primTh->cheie)
        egale=false;
      primA=primA->urm;
      primTh=primTh->urm;
      }
    return egale;
  }
bool lista::operator!=(lista A)
  {
    ref primA=A.getPrim();
    ref primTh=(*this).prim;
    bool egale=true;
    while(primA!=NULL && primTh!=NULL && egale==true)
      {
      if(primA->cheie!= primTh->cheie)
        egale=false;
      primA=primA->urm;
      primTh=primTh->urm;
      }
    return !egale;
  }
void lista::operator+(char m[10])
	{
	(*this).unnod=(ref)malloc(sizeof(Tnod));
	strcpy((*this).unnod->info,m);
	(*this).unnod->cheie=0;
	(*this).unnod->ant=NULL;
  (*this).unnod->urm=(*this).prim;
  (*this).prim->ant=(*this).unnod;
  (*this).prim=(*this).unnod;
	}
listaint::listaint()
	{
	(*this).unnod=(ref)malloc (sizeof(Tnod));
  (*this).unnod->cheie=0;
  strcpy((*this).unnod->info,"_");
  (*this).unnod->ant=NULL;
  (*this).unnod->urm=NULL;
  (*this).prim=(*this).unnod;
	}

void listaint::operator+(char m[10])
	{
	(*this).unnod=(ref)malloc(sizeof(Tnod));
	strcpy((*this).unnod->info,m);
	(*this).unnod->cheie=0;
	(*this).unnod->ant=NULL;
  (*this).unnod->urm=(*this).prim;
  (*this).prim->ant=(*this).unnod;
  (*this).prim=(*this).unnod;
	}
void listaint::print()	
	{
	ref q;
	if((*this).prim->ant!=NULL)
		{
		q=(*this).prim;
		std::cout<<"Lista intersectie a celor doua liste este formata din nodurile : \n";
		while (q!=NULL)
			{
		  std::cout<<"\tinfo : "<<(*this).unnod->info;
		  (*this).unnod=(*this).unnod->urm;
		  std::cout<<"\n";
		  }
		}
		else
		std::cout<<"Intersectia celor doua liste este vida!";
	}
listaint lista::intersectie(lista A)
	{
	bool gata=false;
	listaint D=listaint();
	ref a,b;
		for(a=(*this).prim;a!=NULL;a=a->urm)
			{
			gata=false;
			for(b=A.getPrim();b!=NULL && gata==false;b=b->urm)
				{
				if(a->cheie==b->cheie)
					gata=true;
				if(gata!=true)
					{
					D+(a->info);
					gata=true;
					}
				}
			}
	D.print();	
	return D;
	}



  


  
